package com.rui.cn.consumer.web;


import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.rui.cn.dto.JsonResult;
import com.rui.cn.dto.TreeDto;
import com.rui.cn.entity.system.SysMenu;
import com.rui.cn.feignservice.SysMenuService;
import com.rui.cn.feignservice.SysRoleMenuService;
import com.rui.cn.util.MenuUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.*;

/**
 *@ 描述：菜单控制器类
 *@ 类名：MenuController
 *@ 创建人：[zhang]
 *@ 创建时间：2017/6/17 0017-下午 22:38
 **/
@RestController
@RequestMapping(value = "/menu")
public class MenuController {
    @Autowired
    private SysMenuService menuService;
    @Autowired
    private SysRoleMenuService sysRoleMenuService;

    /**
     *@ 描述：获取所有树形结构 菜单节点信息
     *@ 方法名：getParentMenuTreeData
     *@ 参数：[menuId]
     *@ 返回值类型：java.util.List<com.example.project.dto.TreeDto>
     *@ 创建人：[zhang]
     *@ 创建时间：2017/6/19 0019-下午 20:33
     **/
    @RequestMapping("/getParentMenuTreeData")
    public @ResponseBody List<TreeDto> getParentMenuTreeData(Integer id){
        List<TreeDto> treeList = new ArrayList<TreeDto>();
        List<SysMenu> menuList=menuService.selectList();
        for(SysMenu menu : menuList){
            TreeDto tree = new TreeDto();
            tree.setId(menu.getId());
            tree.setTitle(menu.getTitle());
            tree.setParentid(menu.getParentid());
            treeList.add(tree);
        }
        treeList.add(new TreeDto(0,-1,"系统菜单"));
        //如果是进入修改页面,为放置死循环 ,我们必须本节点以及本节点所有的儿子,孙子,全部过滤掉
        //1:把他的儿子,孙子全部找出来
        //2:把他的儿子,孙子从列表里面remove
        if(id!=null){//代表进入的是修改页面
            Map<Integer,TreeDto> childrenMap = new HashMap<Integer,TreeDto>();
            //1:把他的儿子,孙子全部找出来
            MenuUtil.getAllChildrenMap(childrenMap, treeList, id);
            //2:把他的儿子,孙子从列表里面remove
            Iterator<TreeDto> treeIterator = treeList.iterator();
            while(treeIterator.hasNext()){
                TreeDto tree = treeIterator.next();
                //如果子节点列表里面存在这个对象,则删除
                if(childrenMap.get(tree.getId())!=null){
                    treeIterator.remove();
                }
                //删除本身
                if(tree.getId().equals(id)){
                    treeIterator.remove();
                }
            }
        }
        return treeList;
    }
    @RequestMapping("/gotoMenuEdit")
    public String gotoMenuEdit(Integer menuId,Integer parentId,Model model){
        //如果editFlag = 2 则是进入修改页面，我们需要查询待修改记录的明细信息
//        if(editFlag ==2 ){
//            Menu menu=menuService.getMenuById(menuId);
//            model.addAttribute("menu",menu);
//        }
//        if(editFlag==1){//进入增加页面
//            if(parentId!=null){
//                Menu parentMenu = menuService.getMenuById(parentId);
//                Menu menu = new Menu();
//                menu.setParentId(parentMenu.getId());
//                menu.setParentName(parentMenu.getName());
//                model.addAttribute("menu",menu);
//            }
//
//        }
        return "system/menuEdit";
    }
    /**
     *@ 描述：根据父节点获取菜单列表
     *@ 方法名：main
     *@ 参数：[parentId]
     *@ 返回值类型：org.springframework.web.servlet.ModelAndView
     *@ 创建人：[zhang]
     *@ 创建时间：2018/1/16 0016-下午 21:06
     **/
    @GetMapping("/getMenuList")
    public JsonResult getMenuList(String id) {
        List<SysMenu> menuList;
        if (StringUtils.isBlank(id)) {
            menuList = menuService.selectList();
        } else {
            menuList = menuService.selectListByparentIdOrId(id);
        }
        List<SysMenu> returnMenus= MenuUtil.sortedMenuList(0,menuList);
        JsonResult jsonResult=new JsonResult(returnMenus);
        return jsonResult;
    }
    /**
     *@ 描述：添加修改菜单
     *@ 方法名：menuAddOrUpdate
     *@ 参数：[SysMenu]
     *@ 返回值类型：org.springframework.web.servlet.ModelAndView
     *@ 创建人：[zhang]
     *@ 创建时间：2018/1/16 0016-下午 21:06
     **/
    @RequestMapping("/menuAddOrUpdate")
    public JsonResult menuAddOrUpdate(SysMenu sysMenu){
        if(sysMenu.getId() == null){
            sysMenu.setIcon("&#xe614;");
            sysMenu.setFlag(1);
            sysMenu.setSpread("true");
        }
        boolean flag=menuService.insertOrUpdate(sysMenu);
        return  new JsonResult(flag?1:0);
    }
    /**
     *@ 描述：菜单详情
     *@ 方法名：getMenuInfo
     *@ 参数：[SysMenu]
     *@ 返回值类型：com.rui.cn.dto.JsonResult
     *@ 创建人：[zhang]
     *@ 创建时间：2018/1/16 0016-下午 21:06
     **/
    @RequestMapping("/getMenuInfo")
    public JsonResult getMenuInfo(Integer id,Integer parentid){
        JsonResult result=new JsonResult();
        if(id == null){
            result.setMsg("必须选择一个菜单！");
            result.setState(0);
            return  result;
        }
        SysMenu sysMenu =null;
        if(parentid == 0){//顶级菜单
            sysMenu=menuService.selectById(id);
            sysMenu.setParentName("系统菜单");
        }else {
            sysMenu=menuService.getMenuInfo(id);
        }
        return  new JsonResult(sysMenu);
    }
    /**
     *@ 描述：删除菜单
     *@ 方法名：deletMenu
     *@ 参数：[id]
     *@ 返回值类型：com.rui.cn.dto.JsonResult
     *@ 创建人：[zhang]
     *@ 创建时间：2018/1/16 0016-下午 21:06
     **/
    @RequestMapping("/deletMenu")
    public JsonResult deletMenu(Integer id){
        JsonResult result= new JsonResult();
        if(id == null){
            result.setMsg("必须选择一个菜单！");
            result.setState(0);
            return  result;
        }
        List<SysMenu> menuList=menuService.selectListByparentId(id);
        if(menuList.size()>0){
            result.setMsg("请确定删除所有的子菜单后再进行此操作!");
            result.setData(0);
            return  result;
        }else {
            menuService.deleteById(id);
            Map<String,Object> map=new HashMap<>();
            map.put("menuid",id);
            sysRoleMenuService.deleteByMap(map);
        }
        return new JsonResult(1,"删除成功");
    }
}
